package reflect.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AutoRunMethod {
    /*
        注解中可以定义参数,格式:
        类型 参数名() [default 默认值]

        如果注解中仅定义了一个参数时,推荐参数名使用"value".
 ---------------------------------------------------------------------
        注解传参的机制:
        例如:
        public @interface AutoRunMethod {
            int num();
        }
        当注解中num参数没有指定默认值时,使用该注解则必须为num赋值.
        赋值的语法:@注解名(参数名=参数值)
        在Person的study方法上使用该注解,应当写为:
        @AutoRunMethod(num=6)  //num的值为6
        public void study(){
            System.out.println(name+":在学习");
        }

 ---------------------------------------------------------------------
        当一个注解中有多个参数时:
        public @interface AutoRunMethod {
            int num();
            String name();
        }

        使用该注解时:
        @AutoRunMethod(num=6,name="张三") //分别为注解两个参数赋值
        public void study(){
            System.out.println(name+":在学习");
        }
        传参的顺序可以与注解定义时参数的顺序不一致:
        @AutoRunMethod(name="张三",num=6) //也是可以的
        public void study(){
            System.out.println(name+":在学习");
        }
 ---------------------------------------------------------------------
        有一个麻烦:如果注解只有一个参数时,上述传参方式略显累赘:
        @AutoRunMethod(num=6)  //麻烦
        public void study(){
            System.out.println(name+":在学习");
        }
        因此,java给了一个解决办法:如果仅有一个参数,参数名使用"value".当参数名为value
        时,使用该注解为参数传值时可以不指定参数名:
        public @interface AutoRunMethod {
            int value();
        }
        可以在使用时:
        @AutoRunMethod(6)  //省去"value="
        public void study(){
            System.out.println(name+":在学习");
        }
 ---------------------------------------------------------------------
        多个参数时,每个参数名都不可以忽略
        public @interface AutoRunMethod {
            int value() default;
            String name();
        }
        可以:@AutoRunMethod(value=1,name="张三")
        可以:@AutoRunMethod(name="张三",value=1)
        不可以:@AutoRunMethod(1,name="张三")
        不可以:@AutoRunMethod(name="张三",1)

     */
    int value() default 1;
}
